﻿/**********************************************************************************
 * Project Name :   
 * Remarks      :  
 * Class Name   :  UtilityFactory   
 * Version      :  v1.0.0.0 
 * Author       :  Joey Liang 
 * Description  : 
 * Created Time :  2013/5/22 0:24:49
 * Update Man   :  Joey Liang
 * Update Time  :  2013/5/22 0:24:49
************************************************************************/

using System;

namespace JoeyLibs.Utility
{
    /// <summary>
    /// 工厂帮助类
    /// </summary>
    /// <typeparam name="T">创建对象的类型</typeparam>
    public class UtilityFactory
    {
        /// <summary>
        /// 创建 instance
        /// </summary>
        /// <param name="assemblyName">程序集名称</param>
        /// <param name="classFullName">类全路径名（命名空间+类名）</param>
        /// <param name="args">与要调用构造函数的参数数量、顺序和类型匹配的参数数组。 如果 args 为空数组或 null，则调用不带任何参数的构造函数（默认构造函数）。</param>
        /// <returns>返回创建的对象</returns>
        public static T CreateInstance<T>(string assemblyName, string classFullName, params object[] args)
        {
            return CreateInstance<T>(string.Format("{0},{1}", classFullName, assemblyName), args);
        }

        /// <summary>
        /// 创建 instance
        /// </summary>
        /// <param name="assemblyName">程序集全名，形如“JoeyLibs.Common.className,JoeyLibs.Common”</param>
        /// <param name="args">与要调用构造函数的参数数量、顺序和类型匹配的参数数组。 如果 args 为空数组或 null，则调用不带任何参数的构造函数（默认构造函数）。</param>
        /// <returns>返回创建的对象</returns>
        public static T CreateInstance<T>(string assemblyName, params object[] args)
        {
            T obj = default(T);
            if (string.IsNullOrEmpty(assemblyName))
            {
                return obj;
            }

            Type t = Type.GetType(assemblyName);
            if (t == null)
            {
                return obj;
            }

            return (T)Activator.CreateInstance(t, args);
        }
    }
}
